التعابير النمطية (Regular Expressions) في PHP: شرح شامل وعميق
التعابير النمطية (Regular Expressions) تُعد من الأدوات البرمجية القوية والأساسية التي يعتمد عليها المبرمجون بشكل واسع في معالجة النصوص، البحث، الاستبدال، والتحقق من صحة البيانات. وفي عالم PHP، تلعب التعابير النمطية دوراً محورياً في التعامل مع النصوص، خاصة عند الحاجة إلى تنفيذ عمليات معقدة على النصوص التي تتطلب دقة عالية ومرونة لا تضاهى.
هذا المقال يقدم شرحاً مطولاً وشاملاً للتعابير النمطية (regexp) في PHP، مع التركيز على مكتبة PCRE (Perl Compatible Regular Expressions)، التي تمثل الدعامة الأساسية لتنفيذ التعابير النمطية في PHP. سنغطي في المقال كل ما يتعلق بالتعابير النمطية في PHP من المفاهيم الأساسية، البنى التركيبية، الوظائف المتوفرة، إلى التطبيقات العملية المتقدمة، مع توضيح الأمثلة التفصيلية.
مفهوم التعابير النمطية Regular Expressions
التعابير النمطية هي لغة صغيرة تستخدم لوصف أنماط معينة داخل النصوص. يُمكن اعتبارها كأداة تسمح للبرامج بالبحث عن نص معين يتبع قواعد محددة مسبقاً. مثلاً، يمكن استخدامها للبحث عن أرقام الهواتف، عناوين البريد الإلكتروني، أو التحقق من صحة تنسيق كلمات المرور.
في البرمجة، التعابير النمطية تُستخدم لتنفيذ عمليات مثل:
-
البحث عن نمط معين داخل نص.
-
استبدال أجزاء من النص بنصوص أخرى.
-
تقسيم النص بناءً على نمط معين.
-
التحقق من تطابق النص مع قواعد محددة (Validation).
التعابير النمطية في PHP: مكتبة PCRE
PHP تعتمد بشكل رئيسي على مكتبة PCRE (Perl Compatible Regular Expressions) لتنفيذ التعابير النمطية. مكتبة PCRE توفر توافقاً كبيراً مع تعابير نمطية مكتوبة بلغة Perl، وهو معيار واسع الاستخدام.
وظائف PCRE في PHP تبدأ عادة بالحروف preg_، مثل preg_match، preg_replace، preg_split، وغيرها. هذه الوظائف توفر واجهة قوية ومرنة لمعالجة النصوص.
بناء الجملة (Syntax) الأساسي للتعابير النمطية
في PHP، يتم تضمين التعبير النمطي بين محددات (Delimiters)، وهي غالباً /. فمثلاً، التعبير /abc/ يبحث عن تسلسل الحروف “abc” في النص.
الشكل العام لتعابير PCRE:
bash/pattern/modifiers
-
pattern: هو نمط التعابير النمطية.
-
modifiers: وهي خيارات (اختيارية) تغير سلوك البحث.
أمثلة على محددات (Delimiters) بديلة:
-
/pattern/ -
#pattern# -
~pattern~
المحددات يمكن أن تكون أي رمز غير أبجدي أو رقمي، مع ضرورة أن يكون نفس الرمز مستخدم في البداية والنهاية.
أهم الرموز والبنى في التعابير النمطية
الرموز الأساسية
-
.: يطابق أي حرف (ما عدا نهاية السطر). -
^: بداية السطر أو بداية النص. -
$: نهاية السطر أو نهاية النص. -
\d: يطابق أي رقم (0-9). -
\D: يطابق أي حرف غير رقم. -
\w: يطابق أي حرف أبجدي رقمي أو _ (underscore). -
\W: عكس\w. -
\s: يطابق أي حرف فراغ (مسافة، تبويب، نهاية سطر…). -
\S: عكس\s.
المجموعات (Groups) والتكرار
-
[abc]: يطابق أي حرف من الحروف a أو b أو c. -
[^abc]: يطابق أي حرف غير a و b و c. -
(abc): مجموعة فرعية تُستخدم للالتقاط أو للتكرار. -
a|b: يطابق a أو b.
الكميات (Quantifiers)
-
*: صفر أو أكثر من العنصر السابق. -
+: واحد أو أكثر. -
?: صفر أو واحد. -
{n}: يطابق العنصر السابق n مرة بالضبط. -
{n,}: يطابق العنصر السابق n مرة أو أكثر. -
{n,m}: يطابق العنصر السابق بين n و m مرات.
تعديلات (Modifiers) هامة في PHP PCRE
-
i: تجاهل حالة الحروف (Case-insensitive). -
m: تمكين الوضع متعدد الأسطر (Multiline)، حيث يتغير سلوك ^ و $ ليطابق بداية ونهاية كل سطر. -
s: يجعل الرمز.يطابق أيضاً نهاية الأسطر. -
u: تفعيل دعم UTF-8. -
x: تجاهل الفراغات والتعليقات داخل التعبير النمطي (للتوثيق).
الوظائف الأساسية للتعابير النمطية في PHP
1. preg_match
تستخدم للتحقق من وجود تطابق واحد للنمط في النص.
phpif (preg_match('/abc/', $text)) {
echo "وجد تطابق";
}
تستطيع preg_match أيضاً إرجاع نتائج المجموعات الملتقطة في مصفوفة:
phppreg_match('/(foo)(bar)/', $text, $matches);
print_r($matches);
2. preg_match_all
تبحث عن جميع التطابقات للنمط داخل النص وتُرجعها كلها.
phppreg_match_all('/\d+/', $text, $allNumbers);
3. preg_replace
تُستخدم لاستبدال الأجزاء المتطابقة بنصوص أخرى.
php$newText = preg_replace('/foo/', 'bar', $text);
يمكنها التعامل مع تعابير نمطية معقدة واستبدالها بواسطة نصوص أو دوال.
4. preg_split
تقسم النص إلى أجزاء باستخدام نمط معين كفاصل.
php$parts = preg_split('/[\s,]+/', $text);
الأمثلة العملية في استخدام التعابير النمطية
التحقق من صحة البريد الإلكتروني
php$email = "[email protected]";
$pattern = '/^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$/';
if (preg_match($pattern, $email)) {
echo "البريد الإلكتروني صالح";
} else {
echo "البريد الإلكتروني غير صالح";
}
استخراج أرقام من نص معين
php$text = "لدي 3 تفاحات و 15 برتقالة";
preg_match_all('/\d+/', $text, $numbers);
print_r($numbers[0]); // الناتج: [3, 15]
استبدال أرقام الهواتف بتنسيق موحد
php$phoneNumbers = "اتصل على 123-456-7890 أو 987.654.3210";
$pattern = '/(\d{3})[-.](\d{3})[-.](\d{4})/';
$replacement = '($1) $2-$3';
echo preg_replace($pattern, $replacement, $phoneNumbers);
// الناتج: اتصل على (123) 456-7890 أو (987) 654-3210
التعامل مع المجموعات المرجعية (Backreferences)
المجموعات التي تُلتقط بين أقواس () يمكن إعادة استخدامها في استبدالات أو في نفس التعبير.
مثلاً، لإعادة ترتيب كلمات معينة:
php$text = "John Doe";
$pattern = '/(\w+) (\w+)/';
$replacement = '$2, $1';
echo preg_replace($pattern, $replacement, $text);
// الناتج: Doe, John
التعامل مع التعابير النمطية والـ UTF-8
عند التعامل مع النصوص العربية أو أي نصوص تحتوي على أحرف غير ASCII، من الضروري استخدام الـ modifier u لتفعيل دعم UTF-8.
مثال:
php$pattern = '/[\p{Arabic}]+/u';
$text = "مرحبا بالعالم";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
التعامل مع الأداء والقيود
على الرغم من قوة التعابير النمطية، يجب الانتباه إلى أن التعابير المعقدة جداً قد تؤثر على أداء البرنامج، خاصة عند معالجة نصوص ضخمة أو في حلقات متكررة. لذلك ينصح دائمًا بتبسيط النمط قدر الإمكان.
نصائح لتحسين الأداء
-
استخدام التعابير النمطية المحددة بدقة لتقليل عدد التطابقات غير الضرورية.
-
تجنب الأنماط التي تؤدي إلى حالات Backtracking زائدة (مثل الأنماط التي تستخدم
.*بدون تقييد). -
استخدام الدوال البديلة عند الحاجة، مثل
strposأوsubstrإذا كانت العملية بسيطة ولا تحتاج لتعابير نمطية.
جدول يوضح بعض الرموز والوظائف المهمة في PCRE مع شرحها
| الرمز / الوظيفة | الوصف | المثال | النتيجة المتوقعة |
|---|---|---|---|
. |
يطابق أي حرف ما عدا نهاية السطر | /a.b/ |
يطابق “acb” أو “a9b” |
\d |
يطابق أي رقم من 0 إلى 9 | /\d+/ |
يطابق “123”, “9” |
^ |
بداية النص أو بداية السطر (مع تعديل m) | /^abc/ |
يطابق النص الذي يبدأ بـ “abc” |
$ |
نهاية النص أو نهاية السطر (مع تعديل m) | /xyz$/ |
يطابق النص الذي ينتهي بـ “xyz” |
[abc] |
مجموعة أحرف، تطابق أي حرف من المجموعة | /[aeiou]/ |
يطابق أي حرف من الحروف المتحركة |
* |
صفر أو أكثر من العنصر السابق | /ab*c/ |
يطابق “ac”, “abc”, “abbc” |
+ |
واحد أو أكثر من العنصر السابق | /ab+c/ |
يطابق “abc”, “abbc” |
? |
صفر أو واحد من العنصر السابق | /colou?r/ |
يطابق “color” أو “colour” |
preg_match |
يبحث عن أول تطابق للنمط | preg_match('/foo/', $text) |
يرجع 1 إذا وُجد تطابق |
preg_match_all |
يبحث عن كل التطابقات | preg_match_all('/\d+/', $text, $matches) |
يعيد كل الأرقام الموجودة |
preg_replace |
يستبدل كل التطابقات بنص معين | preg_replace('/foo/', 'bar', $text) |
يستبدل “foo” بـ “bar” في النص |
preg_split |
يقسم النص بناء على نمط معين | preg_split('/[\s,]+/', $text) |
يقسم النص إلى كلمات بناءً على الفراغات والفواصل |
التطبيقات المتقدمة للتعابير النمطية في PHP
1. التنقيح والفلترة المتقدمة
يمكن استخدام التعابير النمطية لفلترة المدخلات مثل كلمات المرور القوية، حيث يتوجب أن تحتوي على حروف كبيرة وصغيرة وأرقام ورموز خاصة.
مثال على تعبير نمطي لكلمة مرور قوية:
php$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@#$%^&+=]).{8,}$/';
$password = "Passw0rd@2025";
if (preg_match($pattern, $password)) {
echo "كلمة المرور قوية";
} else {
echo "كلمة المرور ضعيفة";
}
2. استخدام التعبيرات النمطية في قواعد البيانات
يستخدم المطورون التعبيرات النمطية في PHP للتحقق من صحة المدخلات قبل تخزينها في قواعد البيانات، مما يضمن سلامة البيانات ويقلل من مخاطر الهجمات مثل SQL Injection.
خلاصة
التعابير النمطية في PHP باستخدام مكتبة PCRE تشكل أداة لا غنى عنها للمبرمجين الذين يتعاملون مع النصوص بكافة أشكالها. بفضل مرونتها وقوتها، يمكنها تغطية معظم حاجات البرمجة المتعلقة بالتحقق، البحث، الاستبدال، والتقسيم. معرفة بناء الجمل النمطية الأساسية، الوظائف المرتبطة بها، وكيفية تطبيقها بشكل عملي يجعل من المبرمج قادراً على كتابة شفرات أكثر فاعلية وكفاءة.
في النهاية، يُنصح بالاستمرار في ممارسة التعابير النمطية وتجربة أنماط مختلفة لتحسين الفهم، لأن إتقانها يُعد مهارة برمجية متقدمة تُفتح آفاقاً واسعة في التعامل مع النصوص والبيانات.
المصادر والمراجع
-
PHP Manual: Regular Expressions – https://www.php.net/manual/en/book.pcre.php
-
Regular-Expressions.info – https://www.regular-expressions.info/php.html

